# coding: utf-8
# Author: zhenda


import jwt
from jwt import PyJWTError

from . import const
from flask import current_app
from comment.models.user import User
from datetime import datetime, timedelta


def generate_tokens(uid):
    """
    根据登录的用户id， 生成token密文
    :param uid: 用户的id
    :return:  token
    """
    payload = {
        'id': uid,
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)  # 固定key名，token 的有效时间，必须是格林尼治时间
    }
    #  参数1： token的有效时间,参数1： 密钥, 参数3：加密算法
    s = jwt.encode(payload=payload, key=const.SECRET_KEY, algorithm='HS256')
    return s


def verify_tokens(token_str):
    """
    验证token， 验证成功后，返回用户id
    :param token_str:
    :return:
    """
    try:
        # 本质上就是一个解密的过程
        data = jwt.decode(token_str, key=const.SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message': 'token 验证失败'}
    # 如果token验证成功，还需要看看当前用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status != 0:
        return {'message': '数据库中的用户状态过期'}
    return {'id': user.id}
